<?php

class locationComponents extends sfComponents
{

	//Retorna un array amb la serie de dates existents entre les dues passades com a arguments
	public function datesBetween($startDate, $endDate){
	    // get the number of days between the two given dates.
	    $days = (strtotime($endDate) - strtotime($startDate)) / 86400 + 1;
	    $startMonth = date("m", strtotime($startDate));
	    $startDay = date("d", strtotime($startDate));
	    $startYear = date("Y", strtotime($startDate));   
	    $dates = array();//the array of dates to be passed back
	    for($i=0; $i<$days; $i++){
	      $dates[$i] = date("m-j-Y", mktime(0, 0, 0, $startMonth , ($startDay+$i), $startYear));
	    }
	    return $dates;   
	}


public function executeCalendarVivienda()
  {
	$this->logMessage("El idVivienda que le paso: ".$this->nombreVivienda->getId(), "info");
	
	//Obtenemos los d�as existentes para esta vivienda
	$this->availability = Doctrine::getTable('AlquileresDisponibilidad')->getViviendasWithAvailability($this);
	$q = Doctrine_Query::create()
	    ->select('a.*, b.class AS class')
		->from('AlquileresDisponibilidad a')
		->leftJoin('a.AlquileresEstadosDisp b')
		->where('a.vivienda_id = ?', $this->nombreVivienda->getId())
		->orderBy('a.fecha_disp');
	$this->availability = $q->fetchArray();
	//En aquest array introducimos los d�as de disponibilidad de la vivienda key=YYMMDD i value=estat
	$a[] = array();
	
	$vivienda = Doctrine::getTable('ViviendasAlquileres')->findOneById($this->nombreVivienda->getId());
	//Fecha inicio y fecha final establecida por el calendario de la vivienda
	$fechaInicio = explode("-", $vivienda->getFechaInicioCal());  
	$fechaFin = explode("-", $vivienda->getFechaFinCal());	
	

	//Si existen fechas de disponibilidad para esta vivienda
	if(count($this->availability)){
		$k = 0;
		//Iteramos las fechas de disponibilidad y las introducimos en el array $a
		foreach ($this->availability as $av){
			//Metemos cada fecha en un array tridimensional anyo, mes, dia
			$this->logMessage("Fecha disp: ".$av['fecha_disp'], "info");
			//$fecha = date($av->getFecha_Disp(), 'Y-m-d');
			$utc_str = strftime("%Y-%m-%d", strtotime($av['fecha_disp']));
			$utc_str_year = strftime("%Y", strtotime($av['fecha_disp']));
			$utc_str_month = strftime("%m", strtotime($av['fecha_disp']));
			$utc_str_day = strftime("%d", strtotime($av['fecha_disp']));
			$desc = $av['class'];
			$this->logMessage("Fecha disp utc_str_day: ".$utc_str_day."y descripcion ".$desc, "info");
			//$a[]=$utc_str_year."-".$utc_str_month."-".$utc_str_day."/".$desc;
			$a[$utc_str_year.$utc_str_month.$utc_str_day] = $desc;
			$k++;
		}
		$fechaFirst = $this->availability[0]['fecha_disp'];
		$fechaLast = $this->availability[$k-1]['fecha_disp'];
		$this->logMessage("Fecha inicio: ".$this->availability[0]['fecha_disp'], "info");
		$this->logMessage("Fecha fin: ".$this->availability[$k-1]['fecha_disp'], "info");
	}

	$year = "";
    $first_day=1;
    $arrayAnyo1 = array();
    $arrayAnyo2 = array();
    $arrayAnyo = array();
	$daysSet = array();
	$daysSet3 = array();
	
	array_push($arrayAnyo1, $fechaFin[0]);
	array_push($arrayAnyo2, $fechaInicio[0]);
	$arrayAnyo =array_merge($arrayAnyo1,$arrayAnyo2);
    $arrayAnyo = array_unique($arrayAnyo);
	//Ordenamos los a�os
    sort($arrayAnyo);
	reset($arrayAnyo);
	
	    //No, hay que iterar las fechas de la base de datos
		//Para cada uno de los meses del calendario de la casa
		$mesFin=$fechaFin[1];
		if(count($arrayAnyo)>1){
			$mesFin=($fechaFin[1]+12);
		}
		for($i=$fechaInicio[1];$i<=$mesFin;$i++){
		
			$daysSet = array();
			if($i<=12){
				for($j=1;$j<32;$j++){
					$this->logMessage("Array tridimensional fechasLog: ".$fechaInicio[0].sprintf("%02s",trim($i)).sprintf("%02s",trim($j)), "info");
					if(array_key_exists($fechaInicio[0].sprintf("%02s",trim($i)).sprintf("%02s",trim($j)), $a)){					
						$daysSet[$j] = array($fechaInicio[0]."-".sprintf("%02s",trim($i))."-".sprintf("%02s",trim($j)), $a[$fechaInicio[0].sprintf("%02s",trim($i)).sprintf("%02s",trim($j))]);
						$this->logMessage("Se mete dentro del array availability num".count($daysSet), "info");
					}
				}
			}
			else{
				$nuevoMes = $i-12;
				$nuevoAnyo = $fechaInicio[0] + 1;
				for($j=1;$j<32;$j++){
					$this->logMessage("Array tridimensional fechasLog: ".$nuevoAnyo.sprintf("%02s",trim($nuevoMes)).sprintf("%02s",trim($j)), "info");
					if(array_key_exists($nuevoAnyo.sprintf("%02s",trim($nuevoMes)).sprintf("%02s",trim($j)), $a)){					
						$daysSet[$j] = array($nuevoAnyo."-".sprintf("%02s",trim($nuevoMes))."-".sprintf("%02s",trim($j)), $a[$nuevoAnyo.sprintf("%02s",trim($nuevoMes)).sprintf("%02s",trim($j))]);
						$this->logMessage("Se mete dentro del array availability num".count($daysSet), "info");
					}
				}
				
			}
			//$this->logMessage("Mes ".$i." num dias".print_r($daysSet), "info");
			$daysSet3[$i] = $daysSet;
		}
	//}
	
	$this->arrayAnyo = $arrayAnyo;
	$this->fechaStart = $fechaInicio;
	$this->fechaEnd = $fechaFin;
	$this->daysSet3 = $daysSet3;
	$this->daysSet = $daysSet;
}

public function executeCalendarViviendaInvierno()
{
	$this->logMessage("El idVivienda que le paso: ".$this->nombreVivienda->getId(), "info");

	//Obtenemos los d�as existentes para esta vivienda
	$this->availability = Doctrine::getTable('AlquileresDisponibilidad')->getViviendasWithAvailability($this);
	$q = Doctrine_Query::create()
	->select('a.*, b.class AS class')
	->from('AlquileresDisponibilidad a')
	->leftJoin('a.AlquileresEstadosDisp b')
	->where('a.vivienda_id = ?', $this->nombreVivienda->getId())
	->orderBy('a.fecha_disp');
	$this->availability = $q->fetchArray();
	//En aquest array introducimos los d�as de disponibilidad de la vivienda key=YYMMDD i value=estat
	$a[] = array();

	$vivienda = Doctrine::getTable('ViviendasAlquileres')->findOneById($this->nombreVivienda->getId());
	//Fecha inicio y fecha final establecida por el calendario de la vivienda
	$fechaInicio = explode("-", $vivienda->getFechaInicioCal());
	$fechaFin = explode("-", $vivienda->getFechaFinCal());


	//Si existen fechas de disponibilidad para esta vivienda
	if(count($this->availability)){
		$k = 0;
		//Iteramos las fechas de disponibilidad y las introducimos en el array $a
		foreach ($this->availability as $av){
			//Metemos cada fecha en un array tridimensional anyo, mes, dia
			$this->logMessage("Fecha disp: ".$av['fecha_disp'], "info");
			//$fecha = date($av->getFecha_Disp(), 'Y-m-d');
			$utc_str = strftime("%Y-%m-%d", strtotime($av['fecha_disp']));
			$utc_str_year = strftime("%Y", strtotime($av['fecha_disp']));
			$utc_str_month = strftime("%m", strtotime($av['fecha_disp']));
			$utc_str_day = strftime("%d", strtotime($av['fecha_disp']));
			$desc = $av['class'];
			$this->logMessage("Fecha disp utc_str_day: ".$utc_str_day."y descripcion ".$desc, "info");
			//$a[]=$utc_str_year."-".$utc_str_month."-".$utc_str_day."/".$desc;
			$a[$utc_str_year.$utc_str_month.$utc_str_day] = $desc;
			$k++;
		}
		$fechaFirst = $this->availability[0]['fecha_disp'];
		$fechaLast = $this->availability[$k-1]['fecha_disp'];
		$this->logMessage("Fecha inicio: ".$this->availability[0]['fecha_disp'], "info");
		$this->logMessage("Fecha fin: ".$this->availability[$k-1]['fecha_disp'], "info");
	}

	$year = "";
	$first_day=1;
	$arrayAnyo1 = array();
	$arrayAnyo2 = array();
	$arrayAnyo = array();
	$daysSet = array();
	$daysSet3 = array();

	array_push($arrayAnyo1, $fechaFin[0]);
	array_push($arrayAnyo2, $fechaInicio[0]);
	$arrayAnyo =array_merge($arrayAnyo1,$arrayAnyo2);
	$arrayAnyo = array_unique($arrayAnyo);
	//Ordenamos los a�os
	sort($arrayAnyo);
	reset($arrayAnyo);

	//No, hay que iterar las fechas de la base de datos
	//Para cada uno de los meses del calendario de la casa
	$mesFin=$fechaFin[1];
	if(count($arrayAnyo)>1){
		$mesFin=($fechaFin[1]+12);
	}
	for($i=$fechaInicio[1];$i<=$mesFin;$i++){

		$daysSet = array();
		if($i<=12){
			for($j=1;$j<32;$j++){
				$this->logMessage("Array tridimensional fechasLog: ".$fechaInicio[0].sprintf("%02s",trim($i)).sprintf("%02s",trim($j)), "info");
				if(array_key_exists($fechaInicio[0].sprintf("%02s",trim($i)).sprintf("%02s",trim($j)), $a)){
					$daysSet[$j] = array($fechaInicio[0]."-".sprintf("%02s",trim($i))."-".sprintf("%02s",trim($j)), $a[$fechaInicio[0].sprintf("%02s",trim($i)).sprintf("%02s",trim($j))]);
					$this->logMessage("Se mete dentro del array availability num".count($daysSet), "info");
				}
			}
		}
		else{
			$nuevoMes = $i-12;
			$nuevoAnyo = $fechaInicio[0] + 1;
			for($j=1;$j<32;$j++){
				$this->logMessage("Array tridimensional fechasLog: ".$nuevoAnyo.sprintf("%02s",trim($nuevoMes)).sprintf("%02s",trim($j)), "info");
				if(array_key_exists($nuevoAnyo.sprintf("%02s",trim($nuevoMes)).sprintf("%02s",trim($j)), $a)){
					$daysSet[$j] = array($nuevoAnyo."-".sprintf("%02s",trim($nuevoMes))."-".sprintf("%02s",trim($j)), $a[$nuevoAnyo.sprintf("%02s",trim($nuevoMes)).sprintf("%02s",trim($j))]);
					$this->logMessage("Se mete dentro del array availability num".count($daysSet), "info");
				}
			}

		}
		//$this->logMessage("Mes ".$i." num dias".print_r($daysSet), "info");
		$daysSet3[$i] = $daysSet;
	}
	//}

	$this->arrayAnyo = $arrayAnyo;
	$this->fechaStart = $fechaInicio;
	$this->fechaEnd = $fechaFin;
	$this->daysSet3 = $daysSet3;
	$this->daysSet = $daysSet;
}

	public function executeViviendaFeaturesFavoris(){
				
	}
	
	public function executeViviendaFeatures(){
				
	}
	
	public function executeViviendaDescription(){
				
	}

	public function executeSideboxSameZone(){
		
		$this->sameZoneViviendas = $this->vivienda->getSameZone();
	}
	
	public function executeSideboxInfoZone(){
		
	}

	public function executeSideboxNearestViviendas(){
		
		$q = Doctrine_Query::create()
	 ->select('v.*, ( 6371 * acos( cos( radians('.$this->vivienda->getGeolatitud().') ) * cos( radians( geolatitud ) ) * cos( radians( geolongitud ) - radians('.$this->vivienda->getGeolongitud().') ) + sin( radians('.$this->vivienda->getGeolatitud().') ) * sin( radians( geolatitud ) ) ) ) AS distance')
	  ->from('ViviendasAlquileres v')
	  ->where('v.nombre NOT LIKE ?', $this->vivienda->getNombre())
	  ->having('distance < ?', 3)
	  ->orderBy('distance')
	  ->limit(20);
	  
	  $this->nearest_viviendas_list = $q->execute();

	}
	
	public function executeTablaPrecioPagoonline(){
		
	}
	
	public function executeTablaPrecioNoPagoonline(){
		
	}
	
	public function executeTablaPrecioNoPagoonlineInvierno(){
	
	}
}
?>